/**
 * \* Created with IntelliJ IDEA.
 * \* User: 冯若航
 * \* Date: 2021/6/20
 * \* Time: 21:25
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class 多态 {
    public static class Person {
        public void run() {
            System.out.println("Person.run");
        }
    }

    /**
     * Override和Overload不同的是，如果方法名如果不同，就是Overload，Overload方法是一个新方法；如果方法名相同，并且返回值也相同，就是Override。
     * 注意：方法名相同，方法参数相同，但方法返回值不同，也是不同的方法。在Java程序中，出现这种情况，编译器会报错。(在使用了@Override的情况下)
     */
    public static class Student extends Person {
        @Override
        public void run() {
            System.out.println("Student.run");
        }
    }


        public static void main(String[] args) {
            Person p = new Student();
            p.run(); // 应该打印Person.run还是Student.run?
        }

    /**
     * 一个实际类型为Student，引用类型为Person的变量，调用其run()方法，调用的是Person还是Student的run()方法？
     *
     * 运行一下上面的代码就可以知道，实际上调用的方法是Student的run()方法。因此可得出结论：
     *
     * Java的实例方法调用是基于运行时的实际类型的动态调用，而非变量的声明类型。
     *
     * 这个非常重要的特性在面向对象编程中称之为多态。
     * 多态是指，针对某个类型的方法调用，其真正执行的方法取决于运行时期实际类型的方法
     */
}